% check_data_format.m
% 验证CSV数据格式是否与绘图函数兼容

case_name = 'Conv_Case0';
data_dir = fullfile('build', 'output', 'visualizations');

fprintf('=== 数据格式验证 ===\n');

% 1. 检查帕累托前沿数据
pareto_file = fullfile(data_dir, [case_name '_pareto_solutions.csv']);
if exist(pareto_file, 'file')
    fprintf('1. 帕累托前沿数据:\n');
    data = readtable(pareto_file);
    fprintf('   文件: %s\n', pareto_file);
    fprintf('   行数: %d\n', height(data));
    fprintf('   列名: %s\n', strjoin(data.Properties.VariableNames, ', '));
    fprintf('   时间范围: %.0f - %.0f\n', min(data.time), max(data.time));
    fprintf('   Spill范围: %.0f - %.0f\n', min(data.spill), max(data.spill));
    fprintf('   ✓ 数据格式正确\n\n');
else
    fprintf('   ✗ 文件不存在: %s\n\n', pareto_file);
end

% 2. 检查收敛历史数据
conv_file = fullfile(data_dir, [case_name '_convergence_history.csv']);
if exist(conv_file, 'file')
    fprintf('2. 收敛历史数据:\n');
    data = readtable(conv_file);
    fprintf('   文件: %s\n', conv_file);
    fprintf('   行数: %d\n', height(data));
    fprintf('   列名: %s\n', strjoin(data.Properties.VariableNames, ', '));
    fprintf('   迭代数: %d - %d\n', min(data.iteration), max(data.iteration));
    fprintf('   最终最佳时间: %.0f\n', data.best_time(end));
    fprintf('   最终最佳Spill: %.0f\n', data.best_spill(end));
    fprintf('   ✓ 数据格式正确\n\n');
else
    fprintf('   ✗ 文件不存在: %s\n\n', conv_file);
end

% 3. 检查内存使用统计数据
stats_file = fullfile(data_dir, [case_name '_memory_usage_stats.csv']);
if exist(stats_file, 'file')
    fprintf('3. 内存使用统计数据:\n');
    data = readtable(stats_file);
    fprintf('   文件: %s\n', stats_file);
    fprintf('   行数: %d\n', height(data));
    fprintf('   列名: %s\n', strjoin(data.Properties.VariableNames, ', '));
    fprintf('   缓存类型: %s\n', mat2str(unique(data.cache_type)'));
    fprintf('   步骤范围: %d - %d\n', min(data.step), max(data.step));
    fprintf('   最高使用率: %.1f%%\n', max(data.usage_percent));
    fprintf('   ✓ 数据格式正确\n\n');
else
    fprintf('   ✗ 文件不存在: %s\n\n', stats_file);
end

% 4. 检查内存分配历史数据
alloc_file = fullfile(data_dir, [case_name '_memory_allocation_history.csv']);
if exist(alloc_file, 'file')
    fprintf('4. 内存分配历史数据:\n');
    data = readtable(alloc_file);
    fprintf('   文件: %s\n', alloc_file);
    fprintf('   行数: %d\n', height(data));
    fprintf('   列名: %s\n', strjoin(data.Properties.VariableNames, ', '));
    fprintf('   缓存类型: %s\n', mat2str(unique(data.cache_type)'));
    fprintf('   操作类型: %s\n', strjoin(unique(data.operation), ', '));
    fprintf('   ✓ 数据格式正确\n\n');
else
    fprintf('   ✗ 文件不存在: %s\n\n', alloc_file);
end

% 5. 检查Buffer生命周期数据
lifetime_file = fullfile(data_dir, [case_name '_buffer_lifetimes.csv']);
if exist(lifetime_file, 'file')
    fprintf('5. Buffer生命周期数据:\n');
    data = readtable(lifetime_file);
    fprintf('   文件: %s\n', lifetime_file);
    fprintf('   行数: %d\n', height(data));
    fprintf('   列名: %s\n', strjoin(data.Properties.VariableNames, ', '));
    fprintf('   Buffer数量: %d\n', length(unique(data.buffer_id)));
    fprintf('   最长生命周期: %d步\n', max(data.end_step - data.start_step));
    fprintf('   ✓ 数据格式正确\n\n');
else
    fprintf('   ✗ 文件不存在: %s\n\n', lifetime_file);
end

fprintf('=== 数据格式验证完成 ===\n');
fprintf('所有数据文件格式与绘图函数兼容！\n');
fprintf('可以运行 visualize_conv_case0.m 生成图表\n');
